package event_;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

/**
 * @author DCSGO
 * @version 1.0
 * 通过键盘控制小球的移动
 * Java的事件控制
 */
public class BallMove extends JFrame {
    MyPanel mp = null;

    public static void main(String[] args) {
        BallMove ballMove = new BallMove();
    }

    public BallMove() {
        this.mp = new MyPanel();
        this.add(mp);
        this.setSize(400, 500);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //添加键盘监听器 用于监听 面版 mp
        this.addKeyListener(mp);
    }
}

//监听键盘实际需要实现 KeyListener 接口
class MyPanel extends JPanel implements KeyListener {
    //绘制小球的位置
    private int x;
    private int y;

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillOval(x, y, 20, 20);
    }

    @Override //监听键盘输入 当键盘有字符输入时会调用该方法
    public void keyTyped(KeyEvent e) {

    }

    @Override //监听键盘上的按键被按下 当键盘有按键被按下时会调用该方法
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W) {//上
            y-=5;
        } else if (e.getKeyCode() == KeyEvent.VK_S) {//下
            y+=5;
        } else if (e.getKeyCode() == KeyEvent.VK_A) {//左
            x-=5;
        } else if (e.getKeyCode() == KeyEvent.VK_D) {//右
            x+=5;
        }

        //在键盘进行操作后重绘面板
        repaint();
    }

    @Override //监听键盘上的按键被释放 当键盘有按键被松开时会调用该方法
    public void keyReleased(KeyEvent e) {

    }
}
/**
 * Java事件处理机制是一种用于处理用户交互和程序内部事件的机制。它可以用于处理鼠标点击、键盘输入、窗口操作和其他各种事件。
 * <p>
 * 在Java中，事件处理涉及两个主要组件：事件源和事件监听器。
 * <p>
 * 事件源是生成事件的对象，它可以是一个按钮、一个文本框、一个菜单等。事件源必须是继承自EventObject类的对象。
 * <p>
 * 事件监听器是一个实现了特定接口的对象，它用于监听和处理事件。事件监听器必须实现适当的监听器接口，并实现相应的事件处理方法。
 * <p>
 * 常用的监听器接口包括：
 * <p>
 * 1. ActionListener：用于处理动作事件，例如按钮的点击事件。
 * 2. MouseListener：用于处理鼠标事件，例如鼠标点击、鼠标进入等。
 * 3. KeyListener：用于处理键盘事件，例如按键按下、按键释放等。
 * 4. WindowListener：用于处理窗口事件，例如窗口打开、窗口关闭等。
 * <p>
 * 要使用事件处理机制，需要以下几个步骤：
 * <p>
 * 1. 创建事件源对象，并注册事件监听器。可以使用事件源的addXXXListener()方法将监听器注册到事件源上。
 * <p>
 * 2. 在事件监听器中实现事件处理方法。不同的事件监听器接口有不同的事件处理方法，需要根据具体需求实现相应的方法。
 * <p>
 * 3. 当事件源生成事件时，事件监听器会自动调用相应的事件处理方法进行处理。
 * <p>
 * 下面是一个简单的示例代码，演示了使用Java事件处理机制处理按钮点击事件的过程：
 * <p>
 * import javax.swing.*;
 * import java.awt.*;
 * import java.awt.event.ActionEvent;
 * import java.awt.event.ActionListener;
 * <p>
 * public class EventHandlingExample {
 * public static void main(String[] args) {
 * JFrame frame = new JFrame("Event Handling Example");
 * JButton button = new JButton("Click me!");
 * <p>
 * button.addActionListener(new ActionListener() {
 *
 * @Override public void actionPerformed(ActionEvent e) {
 * // 在按钮点击时触发的事件处理逻辑
 * System.out.println("Button clicked!");
 * }
 * });
 * <p>
 * frame.add(button, BorderLayout.CENTER);
 * frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 * frame.pack();
 * frame.setVisible(true);
 * }
 * }
 * ```
 * <p>
 * 在上面的示例中，创建了一个按钮对象并注册了一个ActionListener。当按钮被点击时，
 * ActionListener会被自动调用，并执行其actionPerformed方法，输出"Button clicked!"。
 * <p>
 * 这就是Java事件处理机制的基本概念和用法。通过使用事件处理机制，可以实现用户交互和事件驱动的程序逻辑。
 */
